#ifndef HITTABLE_LIST_H
#define HITTABLE_LIST_H
#include "hittable.h"
#include <memory>// 动态内存管理工具 智能指针
#include <vector>// 类似变长数组

// using std::make_shared;// using 声明，作用类似解构赋值，下面的代码就可以直接使用 make_shared shared_ptr
using std::shared_ptr;// 智能指针，自动管理对象生命周期。

class hittable_list:public hittable {
    public: 
    std::vector<shared_ptr<hittable>> objects;
    hittable_list(){}
    hittable_list(shared_ptr<hittable> object){
        add(object);
    }
    void clear(){
        objects.clear();
    }
    void add(shared_ptr<hittable> object){
        objects.push_back(object);
    }
    bool hit(const ray& r , double ray_tmin,double  ray_tmax, hit_record& rec )const override{
        hit_record temp_rec;
        bool hit_anything = false;
        auto closest_so_far = ray_tmax;
        for (const auto& object : objects){
            if(object ->hit (r,ray_tmin,closest_so_far,temp_rec)){
                hit_anything = true;
                closest_so_far= temp_rec.t;
                rec = temp_rec;
            }
        }
        return hit_anything;
    }
};

#endif